// import * as biz from '../biz'
import qs from '../query-string'
// import exposure from '../statistics'
import reqwest from 'reqwest'
// import Cache from '../cache'
// import { loadWxSdk } from './utils'

// const cache = new Cache()

const API = getApi()
// const { deviceId, test = false, openStyleType, subActivityWay } = qs.parse()
const { test = false } = qs.parse()
const h5WxShareSwitch = true
/**
 * 获取access_token的接口
 */
function getApi () {
  if (process.env.NODE_ENV === 'development') {
    return '/wechat/getApiTickets'
  }
  return '//engine.tuia.cn/wechat/getApiTickets'
}

/**
 * 获取ticket
 * @param {object} data - 额外请求参数
 * @returns {Promise<{ apiSignature: string, jsapiSignature: string }>}
 */
function getApiTicket (data = {}) {
  return new Promise((resolve, reject) => {
    reqwest.compat({
      url: API,
      type: 'POST',
      contentType: 'application/json',
      data: JSON.stringify(data)
    }).then(result => {
      if (result.code === '0') {
        resolve(result.data)
      } else {
        reject(Error('ticket failed'))
      }
    }, (xhr, msg) => {
      reject(Error('msg'))
    })
  })
}

/**
 * 随机生成字符串
 * @param {number} len - 字符串长度
 */
function randomString (len = 16) {
  const $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678' /** **默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
  const maxPos = $chars.length
  let pwd = ''
  for (let i = 0; i < len; i++) {
    pwd += $chars.charAt(Math.floor(Math.random() * maxPos))
  }
  return pwd
}

// 初始化是否完成的标识位
let isInit = false
// 函数堆栈，一些函数必须在初始化完成之后执行
const callbackStacks = []

/**
 * 微信环境初始化，加载wxsdk和注册api
 */
export function initWxShare () {
  const timestamp = Date.now()
  const nonceStr = randomString()

  Promise.all([getApiTicket({
    noncestr: nonceStr,
    timeStamp: timestamp,
    url: location.href.split('#')[0]
  })]).then(([{ jsapiSignature }]) => {
    wx.config({
      debug: test, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
      appId: 'wx24939b71656a7f96', // 必填，公众号的唯一标识
      timestamp, // 必填，生成签名的时间戳
      nonceStr, // 必填，生成签名的随机串
      signature: jsapiSignature, // 必填，签名
      jsApiList: [ // 必填，需要使用的JS接口列表
        'updateAppMessageShareData', // “分享给朋友”及“分享到QQ”
        'updateTimelineShareData' // “分享到朋友圈”及“分享到QQ空间”
      ]
    })
    isInit = true
    flushQueue()
  })
}

/**
 * 执行回调
 */
function flushQueue () {
  const cbs = callbackStacks.slice(0)
  callbackStacks.length = 0
  wx.ready(() => {
    cbs.forEach(cb => {
      cb()
    })
  })
}

/**
 * 调用api的函数必须在ready之后执行
 * @param {function} fn - 执行函数
 */
export function wxShareReady (fn) {
  if (process.env.NODE_ENV === 'development') {
    return fn()
  }
  if (fn) {
    if (isInit) {
      wx.ready(() => {
        fn()
      })
    } else {
      callbackStacks.push(fn)
    }
  }
}

/**
 * 设置分享的数据信息
 */
export function setWxShareData ({ title, desc, link, imgUrl, success }) {
  // “分享给朋友”及“分享到QQ”
  wx.updateAppMessageShareData({
    title, // 分享标题
    desc, // 分享描述
    link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
    imgUrl: '', // 分享图标
    success: function () {
      window.console.log('分享给朋友聊天成功')
      // 设置成功
      success && success()
    },
    cancel: function () {
      window.console.log('分享给朋友聊天失败')
    }
  })
  // “分享到朋友圈”及“分享到QQ空间”
  wx.updateTimelineShareData({
    title, // 分享标题
    link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
    imgUrl, // 分享图标
    success: function () {
      window.console.log('分享给朋友圈成功')
      // 设置成功
      success && success()
    },
    cancel: function () {
      window.console.log('分享给朋友圈失败')
    }
  })
}

if (h5WxShareSwitch) {
  // 开启的情况，自动初始化
  // initWxShare()
}
